package persistencia.repositorio;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.EntityManagerFactoryImpl;
import org.hibernate.ejb.EntityManagerImpl;
import entidade.Paciente;
import persistencia.unidadepersistencia.UnidadePersistencia;

public class RepositorioPaciente {
	
	public static RepositorioPaciente instanceRepositorioPaciente;
	
	private EntityManager em = UnidadePersistencia.getInstanceUnidadePersistencia().getEntityManager();
	
	private Session secao;
	
	public static RepositorioPaciente getInstanciaRepositorioPaciente(){
		
		if(instanceRepositorioPaciente == null){
			instanceRepositorioPaciente = new RepositorioPaciente();
		}
		return instanceRepositorioPaciente;		
	}
	
	private Session getSession(){

		if(em.getDelegate() instanceof EntityManagerFactoryImpl){
			EntityManagerImpl emi = (EntityManagerImpl) em.getDelegate();
			secao = emi.getSession();
		}else{
			secao = (Session) em.getDelegate();
		}
		return secao;	
	}
	
	public void novo(Paciente novoPaciente) {
		em.getTransaction().begin();
		em.persist(novoPaciente);	
		em.getTransaction().commit();		
	}
	
	public void remover(Paciente pacienteARemover){
		em.getTransaction().begin();
		em.remove(pacienteARemover);
		em.getTransaction().commit();
	}

	public void atualizar(Paciente pacienteAAtualizar){
		em.getTransaction().begin();
		em.merge(pacienteAAtualizar);
		em.getTransaction().commit();
	}

	public Paciente buscarId(Integer id){

		em.getTransaction().begin();		
		Paciente p = em.getReference(Paciente.class, id);
		em.getTransaction().commit();
		return p;
	}

	public List<Paciente> buscarNome(String nome){ 
		Criteria cri = getSession().createCriteria(Paciente.class);
		cri.add(Restrictions.like("nomePaciente", "%"+nome+"%"));
		List<Paciente> lista = cri.list();
		return lista;
	} 

	public List<Paciente> listarTodos(){
		CriteriaBuilder builder = em.getCriteriaBuilder();
		CriteriaQuery<Paciente> criteria = builder.createQuery(Paciente.class);
		criteria.from(Paciente.class);
		return em.createQuery(criteria).getResultList();
	}	
}